package steed.util.file;

import java.io.File;
import java.util.Date;

import javax.servlet.http.Part;

import steed.util.reflect.ReflectUtil;

/**
 * 附件工具(用户文件上传)
 * @author 战马
 *
 */
public class AttachmentUtil {
	private static FileEngine fileEngine = ReflectUtil.getInstanceFromProperties("fileEngine");

	public static FileEngine getFileEngine() {
		return fileEngine;
	}
	
	/**
	  * 上传文件,struts请用 {@code upload(String key,File file,String fileName)}
	  * @param key 可以是文件名可以带上目录名(目录分割符用'/'),最好不要直接用文件名比如admin用户的头像,
	  * 	可以用"admin/headimg"这个字符串作为key,这样用户更新头像,原来的头像也会跟着被覆盖
	  * 	节约空间,也不用担心和其它用户头像文件名重复,导致被覆盖,不需要文件后缀
	  * @param file 要上传的文件
	  * @return 文件key
	  * 
	  * @see #delete(String)
	  */
	public static String upload(String key, File file){
		return fileEngine.upload(key, file);
	}
	
//	/**
//	 * servlet3.0自带的上传文件方式请用该方法,struts请用 {@code upload(String key,File file,String fileName)}
//	 * @param key 可以是文件名可以带上目录名(目录分割符用'/'),最好不要直接用文件名比如admin用户的头像,
//	 * 	可以用"admin/headimg"这个字符串作为key,这样用户更新头像,原来的头像也会跟着被覆盖
//	 * 	节约空间,也不用担心和其它用户头像文件名重复,导致被覆盖,不需要文件后缀
//	 * @param part 要上传的文件
//	 * @return 文件key
//	 * 
//	 * @see #delete(String)
//	 */
//	public static String upload(String key, Part part) {
//		return fileEngine.upload(key, part);
//	}
	
	 /**
	  * 上传文件(struts专用),过时,建议用servlet3.0 自带方式上传文件
	  * 
	  * @param key 可以是文件名可以带上目录名(目录分割符用'/'),最好不要直接用文件名比如admin用户的头像,
	  * 	可以用"admin/headimg"这个字符串作为key,这样用户更新头像,原来的头像也会跟着被覆盖
	  * 	节约空间,也不用担心和其它用户头像文件名重复,导致被覆盖,不需要文件后缀
	  * @param file 要上传的文件
	  * @param fileName 要上传的文件的实际名字(因为struts上传文件,文件后缀统一为.tmp,所以需要传真实文件名)
	  * @return 文件key
	  * 
	  * @see #upload(String, File)
	  * @see #delete(String)
	  */
	@Deprecated
	public static String upload(String key,File file,String fileName){
		return fileEngine.upload(key, file, fileName);
	}

	/**
	 * 获取能够访问该文件的http路径
	 * 
	 * @param key upload方法返回的文件key
	 * @param effectiveTime url有效期,单位:毫秒 (若用的是单机文件引擎该字段暂时无效),请勿传Long.MAX_VALUE,会造成精度溢出<br>
	 * 		用这个{@link #getHttpUrl(String, Date) }
	 * 
	 * @return 能够访问该文件的http路径
	 * 
	 * @see #upload(String, File)
	 * @see #getHttpUrl(String, Date)
	 */
	public static String getHttpUrl(String key, Long effectiveTime){
		return fileEngine.getHttpUrl(key,effectiveTime);
	}
	/**
	 * 获取能够访问该文件的http路径
	 * 
	 * @param key upload方法返回的文件key
	 * @param expireDate url过期日期
	 * 
	 * @return 能够访问该文件的http路径
	 * 
	 * @see #upload(String, File)
	 */
	public static String getHttpUrl(String key, Date expireDate){
		return fileEngine.getHttpUrl(key,expireDate);
	}
	
	/**
	 * 获取调upload方法保存的文件
	 * @param key upload方法返回的文件key
	 * @return
	 */
	public static File getFile(String key){
		return fileEngine.getFile(key);
	}

	/**
	 * 获取能够访问该文件的http路径(有效期10分钟)
	 * 
	 * @param key upload方法返回的文件key
	 * 
	 * @return 能够访问该文件的http路径
	 * 
	 * @see #upload(String, File)
	 */
	public static String getHttpUrl(String key){
		return fileEngine.getHttpUrl(key);
	}

	/**
	 * 删除文件
	 * @param key upload方法返回的文件key
	 * @return 是否删除成功
	 * 
	 * @see #upload(String, File)
	 */
	public static boolean delete(String key){
		return fileEngine.delete(key);
	}
}
